# 生成器: python中一边循环一遍计算的机制 叫做生成器
# 使用了 yield 的函数被称为生成器

li = [i * 5 for i in range(10)] # 列表推导式
print(li)

print("-------------- 生成器表达式 --------------")
gen = (i * 5 for i in range(10)) # 生成器表达式
print(gen) # <generator object <genexpr> at 0x7f7b8811b120>
print(next(gen)) # 0
print(next(gen)) # 5
print(next(gen)) # 10

print("-------------- 生成器函数 --------------")
# 使用了 yield 的函数被称为生成器
# yield: 类似于return, 将指定值或者多个值返回给调用者
# yield: yield语句一次返回一个结果, 在每个结果中间，挂起函数，执行next(),再重新从挂起点继续执行
# yield: 可以多次调用, 每次调用返回一个值, 直到没有更多值可返回

def my_generator(n):
    li = []
    for i in range(n):
        li.append(n)
        yield i * 5  # 使用yield返回值

print(my_generator(5)) # <generator object my_generator at 0x7f9cc80cb120>
rs = my_generator(5)
for i in rs:
    print(i)

print("-------------- 原理 --------------")
def loop_num():
    yield 1
    yield 2
    yield 3
ln = loop_num()
try:
    print(next(ln))
    print(next(ln))
    print(next(ln))
    print(next(ln))
except:
    print("StopIteration error happens")
